{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5.2 Explanation Selectivity"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introduction\n",
    "\n",
    "Another desirable property of an explanation is that it redistributes relevances to variables that have the strongest impact on the function $f(x)$. One of the proposed methods is pixel-flipping where we measure how fast $f(x)$ goes down when removing features with highest relevance scores. The algorithm is given as follows:\n",
    "\n",
    "![title](./assets/5_2_ES/fig1.png)\n",
    "\n",
    "A sharp drop of function's value, characterized by a low AUC score indicates that the correct features have been identified as relevant. AUC results can be averaged over a large number of examples in the dataset.\n",
    "\n",
    "In the Tensorflow walkthrough, we are going to iteratively remove a patch of size $4 \\times 4$ that has the highest relevance score. We will keep track of $f(x)$ as the features are progressively removed."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tensorflow Walkthrough"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Import Dependencies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting MNIST_data/train-images-idx3-ubyte.gz\n",
      "Extracting MNIST_data/train-labels-idx1-ubyte.gz\n",
      "Extracting MNIST_data/t10k-images-idx3-ubyte.gz\n",
      "Extracting MNIST_data/t10k-labels-idx1-ubyte.gz\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "import matplotlib.pyplot as plt\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "\n",
    "from models.models_5_2 import MNIST_CNN, MNIST_DNN, Taylor\n",
    "from utils import find_roi\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "mnist = input_data.read_data_sets(\"MNIST_data/\", one_hot=True)\n",
    "images = mnist.train.images\n",
    "labels = mnist.train.labels\n",
    "\n",
    "logdir = './tf_logs/5_2_ES/'\n",
    "ckptdir = logdir + 'model'\n",
    "\n",
    "if not os.path.exists(logdir):\n",
    "    os.mkdir(logdir)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Building Graph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('Classifier'):\n",
    "\n",
    "    # Initialize neural network\n",
    "    DNN = MNIST_CNN('CNN')\n",
    "\n",
    "    # Setup training process\n",
    "    X = tf.placeholder(tf.float32, [None, 784], name='X')\n",
    "    Y = tf.placeholder(tf.float32, [None, 10], name='Y')\n",
    "\n",
    "    activations, logits = DNN(X)\n",
    "    \n",
    "    tf.add_to_collection('ES', X)\n",
    "    \n",
    "    for activation in activations:\n",
    "        tf.add_to_collection('ES', activation)\n",
    "\n",
    "    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y))\n",
    "\n",
    "    optimizer = tf.train.AdamOptimizer().minimize(cost, var_list=DNN.vars)\n",
    "\n",
    "    correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(Y, 1))\n",
    "    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n",
    "\n",
    "cost_summary = tf.summary.scalar('Cost', cost)\n",
    "accuray_summary = tf.summary.scalar('Accuracy', accuracy)\n",
    "summary = tf.summary.merge_all()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Training Network\n",
    "\n",
    "This is the step where the DNN is trained to classify the 10 digits of the MNIST images. Summaries are written into the logdir and you can visualize the statistics using tensorboard by typing this command: `tensorboard --lodir=./tf_logs`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 0001 cost = 0.229090795 accuracy = 0.927618185\n",
      "Epoch: 0002 cost = 0.065635326 accuracy = 0.979818192\n",
      "Epoch: 0003 cost = 0.044778095 accuracy = 0.985727283\n",
      "Epoch: 0004 cost = 0.034307861 accuracy = 0.989163645\n",
      "Epoch: 0005 cost = 0.027771568 accuracy = 0.991272735\n",
      "Epoch: 0006 cost = 0.023438408 accuracy = 0.992309098\n",
      "Epoch: 0007 cost = 0.019354284 accuracy = 0.993909096\n",
      "Epoch: 0008 cost = 0.016295010 accuracy = 0.994727278\n",
      "Epoch: 0009 cost = 0.013088895 accuracy = 0.995836368\n",
      "Epoch: 0010 cost = 0.012431883 accuracy = 0.996254549\n",
      "Epoch: 0011 cost = 0.010716667 accuracy = 0.996309094\n",
      "Epoch: 0012 cost = 0.009751384 accuracy = 0.996800003\n",
      "Epoch: 0013 cost = 0.009352618 accuracy = 0.996854548\n",
      "Epoch: 0014 cost = 0.006814919 accuracy = 0.997509093\n",
      "Epoch: 0015 cost = 0.007247204 accuracy = 0.997727275\n",
      "Accuracy: 0.9926\n"
     ]
    }
   ],
   "source": [
    "sess = tf.InteractiveSession()\n",
    "sess.run(tf.global_variables_initializer())\n",
    "\n",
    "saver = tf.train.Saver()\n",
    "file_writer = tf.summary.FileWriter(logdir, tf.get_default_graph())\n",
    "\n",
    "# Hyper parameters\n",
    "training_epochs = 15\n",
    "batch_size = 100\n",
    "\n",
    "for epoch in range(training_epochs):\n",
    "    total_batch = int(mnist.train.num_examples / batch_size)\n",
    "    avg_cost = 0\n",
    "    avg_acc = 0\n",
    "    \n",
    "    for i in range(total_batch):\n",
    "        batch_xs, batch_ys = mnist.train.next_batch(batch_size)\n",
    "        _, c, a, summary_str = sess.run([optimizer, cost, accuracy, summary], feed_dict={X: batch_xs, Y: batch_ys})\n",
    "        avg_cost += c / total_batch\n",
    "        avg_acc += a / total_batch\n",
    "        \n",
    "        file_writer.add_summary(summary_str, epoch * total_batch + i)\n",
    "\n",
    "    print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost), 'accuracy =', '{:.9f}'.format(avg_acc))\n",
    "    \n",
    "    saver.save(sess, ckptdir)\n",
    "\n",
    "print('Accuracy:', sess.run(accuracy, feed_dict={X: mnist.test.images, Y: mnist.test.labels}))\n",
    "\n",
    "sess.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Restoring Subgraph\n",
    "\n",
    "Here we first rebuild the DNN graph from metagraph, restore DNN parameters from the checkpoint and then gather the necessary nodes using the `tf.get_collection()` function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./tf_logs/4_2_ES/model\n"
     ]
    }
   ],
   "source": [
    "tf.reset_default_graph()\n",
    "\n",
    "sess = tf.InteractiveSession()\n",
    "\n",
    "new_saver = tf.train.import_meta_graph(ckptdir + '.meta')\n",
    "new_saver.restore(sess, tf.train.latest_checkpoint(logdir))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Attaching Subgraph for Calculating Relevance Scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "conv_ksize = [1, 3, 3, 1]\n",
    "pool_ksize = [1, 2, 2, 1]\n",
    "conv_strides = [1, 1, 1, 1]\n",
    "pool_strides = [1, 2, 2, 1]\n",
    "\n",
    "activations = tf.get_collection('ES')\n",
    "weights = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='CNN')\n",
    "\n",
    "X = activations[0]\n",
    "predictions = activations[-1]\n",
    "\n",
    "weights.reverse()\n",
    "activations.reverse()\n",
    "\n",
    "taylor = Taylor(activations, weights, conv_ksize, pool_ksize, conv_strides, pool_strides, 'Taylor')\n",
    "\n",
    "Rs = [taylor(i) for i in range(10)]\n",
    "SA_scores = [tf.square(tf.gradients(predictions[:,i], X)) for i in range(10)]\n",
    "STD_scores = [tf.gradients(predictions[:,i], X) * X for i in range(10)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Calculating Relevance Scores $R(x_i)$ and Displaying Images\n",
    "\n",
    "The plot indicates that the Simple Taylor Decomposition is the most selective technique of the three, contrary to the original paper. However, I only averaged over ten images, and using a larger sample size may indicate otherwise."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1d1a3203358>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1d14ea5b5f8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sample_imgs = [images[np.argmax(labels, axis=1) == i][1] for i in range(10)]\n",
    "inds = list(range(10))\n",
    "ksize = [4, 4]\n",
    "itr = 20\n",
    "\n",
    "sa_hmaps = []\n",
    "sa_logs = []\n",
    "sa_imgs = []\n",
    "\n",
    "std_hmaps = []\n",
    "std_logs = []\n",
    "std_imgs = []\n",
    "\n",
    "dtd_hmaps = []\n",
    "dtd_logs = []\n",
    "dtd_imgs = []\n",
    "\n",
    "for ind in inds:\n",
    "    sa_img = [sample_imgs[ind]]\n",
    "    sa_coords = []\n",
    "    sa_hmap = []\n",
    "    sa_log = []\n",
    "    \n",
    "    std_img = [sample_imgs[ind]]\n",
    "    std_coords = []\n",
    "    std_hmap = []\n",
    "    std_log = []\n",
    "    \n",
    "    dtd_img = [sample_imgs[ind]]\n",
    "    dtd_coords = []\n",
    "    dtd_hmap = []\n",
    "    dtd_log = []\n",
    "\n",
    "    for i in range(itr):\n",
    "        sa_lg, sa_res = sess.run([predictions[:,ind], SA_scores[ind]], feed_dict={X: sa_img[-1][None,:]})\n",
    "        std_lg, std_res = sess.run([predictions[:,ind], STD_scores[ind]], feed_dict={X: std_img[-1][None,:]})\n",
    "        dtd_lg, dtd_res = sess.run([predictions[:,ind], Rs[ind]], feed_dict={X: dtd_img[-1][None,:]})\n",
    "        \n",
    "        sa_hmap.append(sa_res[0].reshape(784))\n",
    "        sa_log.append(sa_lg.reshape([]))\n",
    "        \n",
    "        std_hmap.append(std_res.reshape(784))\n",
    "        std_log.append(std_lg.reshape([]))\n",
    "        \n",
    "        dtd_hmap.append(dtd_res.reshape(784))\n",
    "        dtd_log.append(dtd_lg.reshape([]))\n",
    "\n",
    "        sa_coord = find_roi(np.square(sa_res[0]).reshape(28,28), ksize, sa_coords)\n",
    "        sa_coords.append(sa_coord)\n",
    "        \n",
    "        std_coord = find_roi(std_res.reshape(28,28), ksize, std_coords)\n",
    "        std_coords.append(std_coord)\n",
    "        \n",
    "        dtd_coord = find_roi(dtd_res.reshape(28,28), ksize, dtd_coords)\n",
    "        dtd_coords.append(dtd_coord)\n",
    "        \n",
    "        if i is itr - 1:\n",
    "            break\n",
    "\n",
    "        temp = np.copy(sa_img[-1])\n",
    "        temp = temp.reshape(28,28) \n",
    "        temp[sa_coord[0]:sa_coord[0]+ksize[0], sa_coord[1]:sa_coord[1]+ksize[1]].fill(0)\n",
    "        sa_img.append(temp.reshape(784))\n",
    "        \n",
    "        temp = np.copy(std_img[-1])\n",
    "        temp = temp.reshape(28,28) \n",
    "        temp[std_coord[0]:std_coord[0]+ksize[0], std_coord[1]:std_coord[1]+ksize[1]].fill(0)\n",
    "        std_img.append(temp.reshape(784))\n",
    "        \n",
    "        temp = np.copy(dtd_img[-1])\n",
    "        temp = temp.reshape(28,28) \n",
    "        temp[dtd_coord[0]:dtd_coord[0]+ksize[0], dtd_coord[1]:dtd_coord[1]+ksize[1]].fill(0)\n",
    "        dtd_img.append(temp.reshape(784))\n",
    "    \n",
    "    sa_hmaps.append(sa_hmap)\n",
    "    sa_logs.append(sa_log)\n",
    "    sa_imgs.append(sa_img)\n",
    "    \n",
    "    std_hmaps.append(std_hmap)\n",
    "    std_logs.append(std_log)\n",
    "    std_imgs.append(std_img)\n",
    "    \n",
    "    dtd_hmaps.append(dtd_hmap)\n",
    "    dtd_logs.append(dtd_log)\n",
    "    dtd_imgs.append(dtd_img)\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "\n",
    "x = list(range(itr))\n",
    "y1 = np.average(sa_logs, axis=0)\n",
    "y2 = np.average(std_logs, axis=0)\n",
    "y3 = np.average(dtd_logs, axis=0)\n",
    "\n",
    "ax.plot(x,y1, label='Sensitivity Analysis', marker='.')\n",
    "ax.plot(x,y2, label='Simple Taylor Decomposition', marker='.')\n",
    "ax.plot(x,y3, label='Deep Taylor Decomposition', marker='.')\n",
    "ax.set_title('Explanation Technique Comparison with Pixel-Flipping', fontdict={'fontsize': 12})\n",
    "ax.set_xlabel('Number of Features Removed', fontdict={'fontsize': 12})\n",
    "ax.set_ylabel('Average Classification Score', fontdict={'fontsize': 12})\n",
    "ax.set_xticks(list(range(0, 20, 5)))\n",
    "ax.set_xbound(0, 19)\n",
    "ax.set_ybound(0)\n",
    "\n",
    "ax.legend(fontsize='large')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is the image of the digit as the features are removed and the heat map produced by Deep Taylor Decomposition. We cam see that the heat map grows fainter and fainter, and at the end, Deep Taylor Decomposition no longer provides an explanation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nBgAAABDv/wAWmluyG95sVgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1d11dc5c278>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABDAAAADZCAYAAADWkMBPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGqFJREFUeJzt3XvQ5mdd3/Frm00wYRMIOYBJ2DyyCSQSDkNSggYJGC2j\nKQZKlSoTaO0wnqY4WnqwB8aqVaEUR+thqhUGqDpUKYJaB5WmoCBhgBLGAAkQlkiQhAAxBwZDYPtH\np5NxOtf7iXd2s9ez+3r9uR+u3/17nue+fr/f/c3NfHYdOHBgAAAAAKzsbx3uEwAAAADYjgEGAAAA\nsDwDDAAAAGB5BhgAAADA8gwwAAAAgOUZYAAAAADLM8AAAAAAlmeAAQAAACzPAAMAAABY3u6/yf/4\n1FNPPbC1tXWITgV2lv37949bb7111/09jn0F9zoY+8qegnu5V8HBZ1/BwXdf99XfaICxtbU13vOe\n92x+VnAEueiiiw7KcewruNfB2Ff2FNzLvQoOPvsKDr77uq/8X0gAAACA5RlgAAAAAMszwAAAAACW\nZ4ABAAAALM8AAwAAAFieAQYAAACwPAMMAAAAYHkGGAAAAMDyDDAAAACA5RlgAAAAAMszwAAAAACW\nt/twn0C7LbKrI/vVeXTPb86z3Y+KY353ZFdEdkFkAAAAwH3hGxgAAADA8gwwAAAAgOUZYAAAAADL\nM8AAAAAAlmeAAQAAACzPAAMAAABY3uI1qm+J7MXz6N23zLNqXz3xhnl27r+ZZ5f8QRz09ZE9IjIA\nAADg//ENDAAAAGB5BhgAAADA8gwwAAAAgOUZYAAAAADLM8AAAAAAlmeAAQAAACxv8RrV986ju+dV\nqd9+8XzZTfFqL4vsG66K8Ma3z7O9+2PhoapR/WJkn94wuyey8yI7NTLYSWpffTKyT0RW++qxkZ0V\nGewUd0ZWe+pjkdU+jYeDvB8v/qjEYVbX8XKo3le1r/ZHdm1kt0V2SWT1fGhfUVbbV5s+A9b9qvbV\nhZFtRXZ07CvfwAAAAACWZ4ABAAAALM8AAwAAAFieAQYAAACwPAMMAAAAYHkGGAAAAMDyFu9a+ap5\ndNc8OjGOeF1kL4/sG94Z4Z9HduWbI6x6qYdGVlU+Y4zx1sh+L7KqAbomsqqf++HInhlZ/fzsLJtW\nJda6PZFVxWit225fvSGy10cWFVp3fnCe7TkhjvnKyJ4bmVrjI0PtjarDrsq2ev+fE1ld/7fbU78W\n2asi+/A8+vjt86xO9fhXRPj8yA5VHToPvNo78Z4bN0VWe+7SyC6IbDubnuvDI4vn8XFrnw5HuUOx\nr+o9d1lk92df1fNq7fMzI3vwhsfENzAAAACA5RlgAAAAAMszwAAAAACWZ4ABAAAALM8AAwAAAFie\nAQYAAACwvMVrVM+eR3fMo1f9chzyT+bRT7w21t0Q2TGRjXdF9tHILoqsaofGGONnI7t6Hn0g6udO\ni0N+4cZ5tq+qJx8T2RMj49CpesZ3RBZ1iLe8bp5Vy+Le50T4wshKVRe/f5u1L51Ht8YF4o/ikNXA\neMcX5tmz6iL3hMjUqB4Z3hPZzZFVPXXdj6K3PN/EdZ5jjPHiefSBu+fZ78YhtyKLW9z43p+L8MLI\n1KgeOep5parkqybxbZFVTWLVPdZ9eowxPhvZQ+bRjc+YZ3uv2uY1YaZq5q+NrPbV/4xs0321Xe33\nPZHtiayq7atKvF4P38AAAAAAlmeAAQAAACzPAAMAAABYngEGAAAAsDwDDAAAAGB5BhgAAADA8hav\nUb14Hu09aZ7dHF1pl86jx0SN6o2/GqfyZ/Os/WVkVQNUdZZjZN3Xh+a/m/3RvhiFtmNXVNq27arA\neOC9JbLvmEfv+so8q9bfajXdW+dSVVhRE5c1om+NbIxxe1SlRj3zT37nPDs3Xu7b/3efzlxdVzgy\n3BRZVaVWxfYVkd0a2acje3NkY4xroyo16oef/q/nWZUI/+zv18lUZZ09dXR4b2RnzaOP/eg82/es\nOOYnIqs998nIxhhj/2avufe/xLqqZq1rTu2rxT+CcJBsuK+u/9F59ujaV3V/rM8d230mqZrV+sz2\nnzd8za/q0znK+QYGAAAAsDwDDAAAAGB5BhgAAADA8gwwAAAAgOUZYAAAAADLM8AAAAAAlrd4h9E5\nkT13Hj3t1fMs2h6jYTVLosYJFd4VWdXn7I/s6nrBkX/WqHzdqnFW/oxFVerO8rZ59I7YPL8wj7Z+\nY579uziTF179hXn45OgtHY+NrGqptqlRrf3xnnn0tRueTas6L458m9a51bq6VlcV4rWRvSGy0Xsq\nLkW1p07sVwzuVVR1aYg24K4frTvA/shqz20nHgKzEvmZkT04ssU/ZvAAqPdV+HKFVW29J7K6P263\n/+u9XJ/16jXPjqx+DnwDAwAAAFieAQYAAACwPAMMAAAAYHkGGAAAAMDyDDAAAACA5RlgAAAAAMtb\nvN+oKqaieubcWPa5eXT6Q2Ld4yI7JbKsratqoaq62q5G9dR59KVPzbN/FIf8ocjuiGxPVR1tXiLJ\nofLRefTBWBZv88/EsmPrVKJFdYxrIoufoboZ776qXnCMPTHvvWteMfvsr4ljviyy2+tkqu7rQbWQ\nI0Jc4/O6esGGx6wauOhQvv6GWDe6fTHu1S+NZY/46c2OOe6JDbdbnd3R4ZzIYl+df1Ksq1rvqu6t\nd3ncx8YY+Wj/1nif3xyH/PuvnmfHfV8srOtK/b45cpwX2UPn0fmnx7qLI6uPttdFdkxkY3R168Mj\nq/OpY9a5xu9tPCKyI4dvYAAAAADLM8AAAAAAlmeAAQAAACzPAAMAAABYngEGAAAAsDwDDAAAAGB5\ni9eoljj1asKp3sYzIntMZDkG+nBkb4ms+qy2+bNd/4F5dlqsuyiy+vm/VCdTFWJn1UJWU3W5j5pH\n1cD7zHq9aiD+UPQhnv+qWBjVxduNc397XpWarVXfGNmTIru7TubCyLZqIQ+4eyKrOtyqWCxVo/uE\nyOq+8t559Pk3bnM+4ecii1rzR9SPUfex2MJjd23GfZFxeNT+qOeueraq/VgPQXUnqwreN82j998y\nz/LeMMbno2Hy5BfEwmpLrmfHb65a18sjU6O6ntpXVVH/2cjqYa66tK+I7OzIPhFZ7fGqJh1jjNo8\nsZfHJyOr60ptyP2RqVEFAAAAWIIBBgAAALA8AwwAAABgeQYYAAAAwPIMMAAAAIDlGWAAAAAAy9vB\nNapfNY8eFsvuiqzafKqVphqC3hZ9V18b9XNf8y1x0G1UjWw1l345st1fG9mpsbDqxY6Oqp+dJWqk\nHhnLomK1tmOWVlWD1O9GdtEN8+wfRlfytlfDL8yjqJGtS9XYd1yEW5E9b8N1PPD2Rxa1vnl9jI7R\nXFdvxl+PLCriTo738B3b9D3WvbOaS+vCEbeq8dX132y+O7KtyDg8qrrz6siqgrqeZc7bcN1PzqPf\niarU2qrvi2yM8erITnztPPuTWPea2lffXGdTNdKsp/bO+yO7ILK6J9W6rcjeEVnVKNfGqrrTMcZ4\n1Tb5TP38l0b2B5Ht4I/vB4lvYAAAAADLM8AAAAAAlmeAAQAAACzPAAMAAABYngEGAAAAsDwDDAAA\nAGB5O7iHJWppdu+dZ8fdOM+OjZf7TGQfjOyJkZ1ZBZNvnUd3b1NNV5WOVZW6VQett8opkZ1dB2U5\n58yjqlGLNsgqkLopsr3V6XbxhtmHPjXPoiV1jDHGY7bJZ55UYe2rqubb9GR44FVX6J7Iou9wfOuG\nr1fvt49GFlV3v/3OeRbbbbvDZttd1ah+pV6wrkZVk8l6qmf74fPo88+eZyf/xIavF2/Wm+KZM05z\nXD6PPn9rrBv92PmRyP5uHfTrI7szHoL31PMh66n3eV146570yg1fr+6PVaMa6379x+fZdz05jjlG\nP3edGdldkVUd9F9FVjfIo4NvYAAAAADLM8AAAAAAlmeAAQAAACzPAAMAAABYngEGAAAAsDwDDAAA\nAGB5O7hGteo5o+rmjKi02opDVo3q2yP7UmS3f26ePTLW7TkpwjGyfnH3nZHV26Gy6sLbioz1PGEe\nbVijWi2iN0e297ciLNXK9bjIqn54jDGq9bj2eTWPZU3YJZFF3S2Lqb9xvVnr71/HrHq1j2227u2/\nP8/+PA55RmRjjFG3sqr8rvtjqt/pYzc9KIdFXVhjX518Zayrmt2qtY7a+3p2/Lp59MdRB/wNx8Yx\nxxjfeFZkdT7VePr6yOrZYE/eAFlOvQni88P4gchq71QWFaO3vG+e/Z15dOCaebbr694d5zLG+JpL\nI6zPQVdHdl1kdZ+vDuajg29gAAAAAMszwAAAAACWZ4ABAAAALM8AAwAAAFieAQYAAACwPAMMAAAA\nYHk7uEY1eqLGE+fRrmvn2TM+Nc/eGC+3P7KHRFZtd+dGtu2frfJ60U0re6rStiqSWE9UEO96xjw7\n46ppdF5Uxb3rT+fZ7dGxelK1UlXd6QmRHRPZGGMct+HaXXVCdR3bF5l9tXPUdbVq6ervX+oa/9HN\nzqX6jk/c8FTG6P+EUlnt49puWZVaFZqsp55JPhnZFZFt+uwUHaMfmUf/PapS69U+W7XdY4xTqiq1\n1K+0qov3nR7heRueDIdHPVvcFNkzI6t99aDIfnUeRYvqz0dV6t3xaj98R4RjjDHuiazu81XffWFk\nm16Pjg6+gQEAAAAszwADAAAAWJ4BBgAAALA8AwwAAABgeQYYAAAAwPIMMAAAAIDlGWAAAAAAy6uS\n2cVVV/ETInvHPHrRp+fZiVHYXZ3bp0VWtfO7H19hZGOMET9HeuiGWf0t2FnOiuyyebTvqnn2ynn0\nlJfHy1XleHXSb0X2uMiO32aee2dcA1Ltj4dHVn8Ldo7qh8+bQGRfjOyTkVV3/FPm0cP+cJ5dFIfc\nbst8MLLajidGdvwJEdpTR46tDdfVHrg1snh2rL36TduczsS3PizCY3vt9TfPs2Ni3b47Iqwsr3E7\n+GPGUamukfdEtum++h/z6MAt8yw+5tVt5aWRjQdXOEY/r5X63VRG8Q0MAAAAYHkGGAAAAMDyDDAA\nAACA5RlgAAAAAMszwAAAAACWZ4ABAAAALG8H9xtVbdMlkVXF3G3z6B9ElrVDVZFzdmTXRHZKZGN0\n1VFVrD5om+POqAE6clRd7nPn0XHXzbNHvW6e/Yd4uWqs2lOz1wvm0d0fiHVVaTnG2BNVYLffHQs3\n3R/21ZHhUFSo3RlZvY+rmzhqIi970Ty751fmWVYvjq4Zr1vVcdscd6qeG9hZqp5602r3/ZF9ObI/\nmEfv/NQ0+ntXxyH/Y2S1N8YYx0SN6tti3SM/NM+Oe2K9YtU6s7PUM2C+CUJ97rpwHu168jy76t3T\n6Bevipd7ej07bnc/jmdLHnC+gQEAAAAszwADAAAAWJ4BBgAAALA8AwwAAABgeQYYAAAAwPIMMAAA\nAIDl7eAa1VK1ps+LrKq3qtY06hWzkqgqe2pd1aSOkZVFBz43z3adE8e8NrL9kdW5HqFvvyNWvT/+\n+Tw6fSuyKnWr6q2qinzIPDruw7GuqinHGH8RValVF3lSHfe9kVVXnn3FTFUaxt4Yl0UW1/9678ft\nZowxxkci+0xkT4rspi/Ms/P3x8L6vak0PjrUdbXuR/vm0eVxHf+L6+fZsfFyj4xsjPHDkf1RZA+O\n7HkX1yvWswHUvrotssfMo++Kz12fv2GeHfjKPNtVnw/HyH3umewB5xsYAAAAwPIMMAAAAIDlGWAA\nAAAAyzPAAAAAAJZngAEAAAAszwADAAAAWN4R2u1SP9ZWZM+PrCrmql5ru8rTTdZ9tJdev1133cSj\n98+zez41z3a/KQ5af4uql7wusvp9fyyyqkCq+qTnTv79QKw5EtXf8oLItiL7jsjqb1mVh3Wed0X2\nZ5GNMX4rsqq8OyMqvb4U606uPVAVq1UHXeuq0rWyqua8JLKnTP79aNtXm6hazz0bZlVNHOtOPmme\nfe72OOYY45cj+3Jk0a6Xl4bzr45wf2RbkdX9uGqiK6s9fHlks+cUe+q+qd/72Rtm4aujm/QXXzfP\nqmJ4jHHer82zaj2uu/j4lgqzYzVEFeZ4a2Qvn0fvf988Oy0OeeaLNni9ukhxr9pXdTGv55V4zju5\nrpH1epdGNkb/HCvVqNbv7fci+7F59L9unGdnxCEffWWEr5z8+3373OwbGAAAAMDyDDAAAACA5Rlg\nAAAAAMszwAAAAACWZ4ABAAAALM8AAwAAAFjeEVqjuqmqptvaMCu3RfbmyG7qw14T2QmRHRtVqV+J\nda/+/Xn2xcjqXN4T2cMi+9uRPeeD82xvde89YfLvtYZ7VXVjFbdlqVuoCqmoX7tpm/rheCvne/mU\nyC6K7MQfn2e7z4yFVV1aFVpVW1eVtlVLVnVYW5N/r25Z/q+6dVcdamUl9tSBqEqNRsMxxrj+T+ZZ\n3Y33vjrCZ0b29jfOs6edFwu/LbJXRfaGeXRrXG9OPT2OWXtqthfvjjXc66GRPX3DrEQF70nxdz72\nN/KoL4sa1VHNxvX89OjjIrwwz2fuNfPo4y+ZZ1W/HNeU8XWRfc+vzLN9V0yCO+OA3KueAZ+6YVbq\nGbDUeY7Rz/yV1d3sUIh9df2/nGe/EIes1u9qn/3eqIM+/7mT4L7tK9/AAAAAAJZngAEAAAAszwAD\nAAAAWJ4BBgAAALA8AwwAAABgeQYYAAAAwPLUqO5IVaM2ukbqQZFdHVm171VD22cj+0hkz4nsRyOr\nqst6vZ8/J8JZpU91y7Km2Dt39cqb4r11bKw7vaokoyku6yD3vTfCei9H1dcH/nCe1d554g3zbF/9\nELNzORBrODxi31R73B191B/b6FzG+MZoJ/3uaAMfL4jsaVUj/NjI4hfwn6Iq9c/ikE+9ZZ5dWVWf\ns3vVl2MNa3r+PDp+q5d+50/Ns9ofZz5qs/OZVs1vJ7oZ49rxyp+eZ6+NV/uBeDZ+0Y/EwvHJyb+r\nJ15TfUY6VJWm23wue0Bttq9e8nPz7L/Gq73kmsj+bSy8n/vKNzAAAACA5RlgAAAAAMszwAAAAACW\nZ4ABAAAALM8AAwAAAFieAQYAAACwPDWqh1X9+vdFdmYf9qwPzrM/jXUfnkd3fWieVUvkH0f27yM7\n7c3z7JWx7kmRbe2PMH+neyb/bv63pqrJijrEM+qdPMaZUUH8+r+aZw/6+Dz71h+YZ8e9MU7mkb8S\nC6vS7qx59JlY9oXIsiqz+pdnf6dddUAOi9hTxz9+np39gTzq4yKritW4PYz3xT3u58+Nhee+e55d\nFj1xY2se/Xksuy2yaF8d4+GRze5Vx9QBOWyqEvfiyC7pw+76/nl25q2x8GORvSmyF0ZWFcR/OY8e\nf8Y0uia6YOs2NittHGOMcfLeCGf3sSpQ5/CZXQfvr6pKrQv6OyL7tciujqye826eRxeeNI2uG7dP\ns3rMuymycep8H9/ffeUTGAAAALA8AwwAAABgeQYYAAAAwPIMMAAAAIDlGWAAAAAAyzPAAAAAAJan\nRvWwqrrHrciqmnCM8c++fp7d885YN49OiBrVKG0dPxjZv/qlCB8Z2SmRPSSy858cYZn9ncz/1lT7\n6sJ5tOctfdiP3zKNnvdH82UHXjDProuXO+/Zx0V6QWRfjCxqwC77J7GuqvfOiaxuMfbVzlF76rJ5\ndG7XqP6L/xbZ6+fZj7xhnlVT+HhxZI+phXdGFvvt5c+IdVU+F9ep/FuoJt5Z6m9ZlY3bqXvAtZFV\nVWpVrF4aWdX+VrHpfM+95ndj2Ucje2pkWb05e+j0EWpNq+2ruJllVWrVJdfnwM/Oo3vmVam/E/fj\n8ZHIavvn3+L+7StPigAAAMDyDDAAAACA5RlgAAAAAMszwAAAAACWZ4ABAAAALM8AAwAAAFieDqDD\nqn79+yJ77DbHjWqq3SfNs5+Z11bt+qGvTLPv+Zk4lRdG9r7IHhzZGZHtPSHC6vrZpK7o2FjD4bNh\njWp3QY1xzG/Os4fNo103z7PzqoP4irvn2ZuiujIrVmtjVS3XpyPbiqyuVQ+d/PsxsYbDY8Ma1b2/\n14e95vp5dto8+qmqe4tWuusvmmePPvDNcdCLI5u9j8cY4+zIPhFZ7Zs6l1Mn/+5etaZDVfdYlaDV\nF3zePHr7/P73ukvnD3NXHvi+eL1nRvaUeXR59CjfHjfVk54cr1cdy7N76vGxhsOn9lVVoW6n9lV9\nZouq+d+e76uXPOfGafaKA98Zr/dt82h33K+/PepePx/36pNrX31/ZPdvX/kGBgAAALA8AwwAAABg\neQYYAAAAwPIMMAAAAIDlGWAAAAAAyzPAAAAAAJanRnVZUbsznr/N2qjCGu+ILKqpHnbDPHvJNqcz\n84LIdl8Z4XMjq4q5qonchPnfzhM9iuOlvfT0eG9d/uux8MNxzK159vQr4phV2fXwyOq68tTIHki7\nDvcJ8P+pR4WqH35NH/ZZr51n3/RL8+wjccxnzKNHv+JZsfCJkVUdaq2rPfxAsqfWVPvq/jyeV41k\nHTfuHU/7kWl05YEHbXguW5HVdeXH5tFJseygU/m989T7cTtVwVq1x1Ff/+wXTaNXHKiK7jhm7quo\nUa19dXIsO+ju27XPJzAAAABgeQYYAAAAwPIMMAAAAIDlGWAAAAAAyzPAAAAAAJZngAEAAAAsT43q\nsupPc9Y2a6su9JLIvm0e7bk2sts2PJcnRFZVsPenBomjW713LthmbVWQVrVv7J2qWM1rQO2rPZHZ\nOxxs9X57yjZro4L0+BfPs8dXHfh7I6s9VVWpVWdnT7GaTWtUqybyXRueS10DTonMvmI19Z6s+2Bl\n+yOratbaV1GHfATtK9/AAAAAAJZngAEAAAAszwADAAAAWJ4BBgAAALA8AwwAAABgeQYYAAAAwPLU\nqB6R6s96amRP3TCDo0HVT21tmF2+0ZnAkaH2VFVpV/aPNzwXOFJsWhde2T/d8FzgSHEo7lc/uOG5\n4BsYAAAAwPIMMAAAAIDlGWAAAAAAyzPAAAAAAJZngAEAAAAszwADAAAAWJ4BBgAAALA8AwwAAABg\neQYYAAAAwPIMMAAAAIDlGWAAAAAAyzPAAAAAAJZngAEAAAAsb9eBAwfu+/94167PjDE+cehOB3aU\nsw8cOHDa/T2IfQV/zf3eV/YU/DXuVXDw2Vdw8N2nffU3GmAAAAAAHA7+LyQAAADA8gwwAAAAgOUZ\nYAAAAADLM8AAAAAAlmeAAQAAACzPAAMAAABYngEGAAAAsDwDDAAAAGB5BhgAAADA8v4Pqpv8vVy5\nVvUAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1d1a3485b00>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "digit = 4\n",
    "\n",
    "fig = plt.figure(figsize=[15,15])\n",
    "for i in range(5):      \n",
    "    ax = fig.add_subplot(1, 5, i + 1)\n",
    "    ax.imshow(dtd_imgs[digit][i * 2].reshape([28,28]), cmap='gray')\n",
    "    ax.tick_params(labelbottom='off', labelleft='off', bottom='off', left='off')\n",
    "plt.tight_layout()\n",
    "\n",
    "fig = plt.figure(figsize=[15,15])\n",
    "for i in range(5):      \n",
    "    ax = fig.add_subplot(1, 5, i + 1)\n",
    "    ax.imshow(dtd_hmaps[digit][i * 2].reshape([28,28]), cmap='hot_r')\n",
    "    ax.tick_params(labelbottom='off', labelleft='off', bottom='off', left='off')\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autoclose": false,
   "autocomplete": true,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
